package com.yunxi.module.system.service.user;

import com.yunxi.framework.common.pojo.PageResult;
import com.yunxi.module.system.model.user.AdminUserDO;
import com.yunxi.module.system.vo.admin.user.profile.UserProfileUpdatePasswordReqVO;
import com.yunxi.module.system.vo.admin.user.profile.UserProfileUpdateReqVO;
import com.yunxi.module.system.vo.admin.user.user.UserImportExcelVO;
import com.yunxi.module.system.vo.admin.user.user.UserImportRespVO;
import com.yunxi.module.system.vo.admin.user.user.UserPageReqVO;
import com.yunxi.module.system.vo.admin.user.user.UserSaveReqVO;

import javax.validation.Valid;
import java.io.InputStream;
import java.util.List;

/**
 * <p>
 * 后台用户 Service 接口
 * </p>
 *
 * @author lidy
 * @since 2024-05-08
 */
public interface AdminUserService {

    /**
     * 通过用户 ID 查询用户
     *
     * @param id 用户ID
     * @return 用户对象信息
     */
    AdminUserDO getUser(Long id);

    /**
     * 更新用户的最后登录信息
     *
     * @param userId  用户 ID
     * @param loginIp 登录IP
     */
    void updateUserLogin(Long userId, String loginIp);

    /**
     * 根据用户账号查询用户信息
     *
     * @param username 用户账号
     * @return 用户信息
     */
    AdminUserDO getUserByUsername(String username);

    /**
     * 判断密码是否匹配
     *
     * @param unEncodedPassword 未加密的密码
     * @param encodedPassword   加密后的密码
     * @return 是否匹配
     */
    boolean isPasswordMatch(String unEncodedPassword, String encodedPassword);

    /**
     * 修改用户个人信息
     *
     * @param userId 用户编号
     * @param reqVO  用户个人信息
     */
    void updateUserProfile(Long userId, UserProfileUpdateReqVO reqVO);

    /**
     * 修改用户个人密码
     *
     * @param userId 用户编号
     * @param reqVO  更新用户个人密码
     */
    void updateUserPassword(Long userId, @Valid UserProfileUpdatePasswordReqVO reqVO);

    /**
     * 更新用户头像
     *
     * @param userId     用户编号
     * @param avatarFile 头像文件
     * @return 头像文件地址
     * @throws Exception 异常
     */
    String updateUserAvatar(Long userId, InputStream avatarFile) throws Exception;

    /**
     * 获得用户分页列表
     *
     * @param pageReqVO 分页条件
     * @return 分页列表
     */
    PageResult<AdminUserDO> getUserPage(UserPageReqVO pageReqVO);

    /**
     * 获得制定状态的用户集合
     *
     * @param status 状态
     * @return 用户集合
     */
    List<AdminUserDO> getUserListByStatus(Integer status);

    /**
     * 新增用户
     *
     * @param reqVO 用户信息
     * @return 用户 ID
     */
    Long createUser(UserSaveReqVO reqVO);

    /**
     * 修改用户
     *
     * @param reqVO 用户信息
     */
    void updateUser(UserSaveReqVO reqVO);

    /**
     * 删除用户
     *
     * @param userId 用户编号
     */
    void deleteUser(Long userId);

    /**
     * 修改用户状态
     *
     * @param userId 用户编号
     * @param status 状态
     */
    void updateUserStatus(Long userId, Integer status);

    /**
     * 批量导入用户
     *
     * @param userList        用户信息集合
     * @param isUpdateSupport 是否支持更新
     * @return 导入结果
     */
    UserImportRespVO importUserList(List<UserImportExcelVO> userList, Boolean isUpdateSupport);

    /**
     * 修改密码
     *
     * @param userId   用户编号
     * @param password 密码
     */
    void updateUserPassword(Long userId, String password);
}
